module shifter (In,Cnt,Op,Out);
//  00  ROL
//  01  SLL
//  10  ROR
//  11  SRL
	
	input   [15:0]  In;
	input   [3:0]   Cnt;
	input   [1:0]   Op;
	output  [15:0]  Out;

	wire    [15:0]  S1,S2,S3;
    wire    [15:0]  rs0,rs1,rs2,rs3;
	wire    low = 0;

	assign  rs0 = Op[0]?{16{low}}:In;
	assign  rs1 = Op[0]?{16{low}}:S1;
	assign  rs2 = Op[0]?{16{low}}:S2;
	assign  rs3 = Op[0]?{16{low}}:S3;
    
	assign  S1 = Cnt[0]?(Op[1]?{rs0[0],In[15:1]}:{In[14:0],rs0[15]}):In;
	assign  S2 = Cnt[1]?(Op[1]?{rs1[1:0],S1[15:2]}:{S1[13:0],rs1[15:14]}):S1;
	assign  S3 = Cnt[2]?(Op[1]?{rs2[3:0],S2[15:4]}:{S2[11:0],rs2[15:12]}):S2;
	assign  Out= Cnt[3]?(Op[1]?{rs3[7:0],S3[15:8]}:{S3[7:0],rs3[15:8]}):S3;

endmodule
